Лабораторна робота № 2
ТЕМА: Програмування текстової відеопам’яті у захищеному режимі.
МЕТА: Навчитись виводити текстову інформацію на екран комп’ютера у захищеному режимі роботи процесора шляхом програмування текстової відеопам’яті.
Короткі теоретичні відомості
Під час увімкнення комп’ютера, у процесорі автоматично встановлюється режим реальної адреси (реальний режим). Перехід у захищений режим здійснюється програмно. Оскільки багато деталей функціонування процесора в реальному і захищеному режимах істотно відрізняються, програми, призначені для захищеного режиму, повинні бути написані особливим чином. Реальний і захищений режими є несумісними.
Розглянемо програму, яка у захищеному режимі виводить рядок символів з заданим атрибутом (колір символа і його фон) на монітор шляхом програмування текстової відеопам’яті комп’ютера.
.386P ;Дозвiл трансляцiї привiлейованих команд
;Структура для опису дескрипторiв сегментiв
descr struc
limit dw 0 ;Межа (бiти 0..15)
base_l dw 0 ;База, бiти 0..15
base_m db 0 ;База, бiти 16..23
attr_1 db 0 ;Байт атрибутiв 1
attr_2 db 0 ;Межа (бiти 16..19) i атрибути 2
base_h db 0 ;База, бiти 24..31
descr ends
;Сегмент даних
data segment use16 ;16-розрядна програма
;Таблиця глобальних дескрипторiв GDT
gdt_null descr <0,0,0,0,0,0> ;Селектор 0 - обов'язковий
;нульовий дескриптор
gdt_data descr <data_size-1,0,0,92h,0,0> ;Селектор 8,сегмент даних
gdt_code descr <code_size-1,0,0,98h,0,0> ;Селектор 16,сегмент команд
gdt_stack descr <255,0,0,92h,0,0> ;Селектор 24, сегмент стеку
gdt_scree descr <4095,8000h,0Bh,92h,0,0> ;Селектор 32,відеобуфер
gdt_size=$-gdt_null ;Розмiр GDT
pdescr dq 0 ;Псевдодескриптор для lgdt
real_sp dw 0 ;Змiнна для збереження SP
sym db 1 ;Символ для виведення на екран
attr db 1eh ;Його атрибут
mes db 27, '[31;42m Повернулися в реальний режим! ',27,'[0m$'
data_size=$-gdt_null ;Розмiр сегменту даних
data ends ;Кiнець сегменту даних
;Сегмент команд
text segment 'code' use16 ;16-розрядна програма
assume CS:text, DS:data
main proc
mov AX, data ;Iнiцiалiзацiя DS
mov DS, AX ;у реальному режимi
;Знайдемо 32-бiтову лiнiйну адресу сегменту даних
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_data
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту команд
mov AX, CS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_code
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту стеку
mov AX,SS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_stack
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Пiдготуємо дескриптор i завантажимо регiстр GDTR
mov BX,offset gdt_data ;Адреса GDT
mov AX,[BX].base_l;Одержимо та занесемо у pdescr
mov word ptr pdescr+2, AX ;базу, бiти 0..15
mov DL,[BX]. base_m;Одержимо i занесемо у pdescr
mov byte ptr pdescr+4, DL ;базу, бiти 16..23
mov word ptr pdescr, gdt_size-1 ;Межа GDT
lgdt pdescr ;Завантажимо регiстр GDTR
;Пiдготуємося до повернення в реальний режим
mov AX, 40h ;Налаштуємо ES на область
mov ES,AX ;даних BIOS
mov word ptr ES:[67h],offset return;Зсув точки повернення
mov ES:[69h],CS ;Сегмент точки повернення
;Пiдготуємося до переходу в захищений режим
cli ;Заборона апаратних переривань
mov AL,0Fh ;Вибiрка байту стану вiдключення
out 70h,AL ;Порт КМОП-мiкросхеми
...